home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 01 - 1984 & 1985 / 01.03 Feb 85.sit / 01.03 Feb 85 / Asm Vol. 1 No. 3 / mactutor ad.asm / mactutor ad.asm
Encoding:
Assembly Source File  |  1985-01-23  |  19.4 KB  |  866 lines  |  [TEXT/EDIT]

  1. ; EXAMPLE ASSEMBLY PROGRAM 
  2. ; MacTutor  Ad  
  3. ; VERSION 22 JAN 85
  4. ; (C) 1985 MacTutor by David E. Smith
  5.  
  6. ;    Macro subset for Toolbox stuff
  7.  
  8. MACRO _InitGraf =     DC.W $A86E|
  9. MACRO _InitWind =    DC.W $A912| 
  10. MACRO _NewWindow =    DC.W $A913|
  11. MACRO _setport =    DC.W $A873|
  12. MACRO _InitFont =    DC.W $A8FE|
  13. MACRO _InitMenu =    DC.W $A930|
  14. MACRO _InitDialog =    DC.W $A97B|
  15. MACRO _TEInit   =    DC.W $A9CC|
  16. MACRO _Initpack =       DC.W $A9E5|
  17. MACRO _FlushEvents =    DC.W $A032|
  18. MACRO _InitCursor =    DC.W $A850|
  19. MACRO _GetNextEvent =    DC.W $A970|
  20. MACRO _FrameRect =     DC.W $A8A1|
  21. MACRO _TextFont =     DC.W $A887|
  22. MACRO _TextFace =     DC.W $A888|
  23. MACRO _TextSize =     DC.W $A88A|
  24. MACRO _MoveTo =     DC.W $A893|            
  25. MACRO _DrawString =     DC.W $A884|
  26. MACRO _PenSize =    DC.W $A89B|
  27. MACRO _EraseRect =    DC.W $A8A3|
  28. MACRO _GetRMenu =    DC.W $A9BF|
  29. MACRO _InsertMenu =    DC.W $A935|
  30. MACRO _DrawMenuBar =    DC.W $A937|
  31. MACRO _Debugger =     DC.W $A9FF|
  32. MACRO _NewMenu =     DC.W $A931|
  33. MACRO _AppendMenu =    DC.W $A933|
  34. MACRO _AddResMenu =    DC.W $A94D|
  35. MACRO _FindWindow =    DC.W $A92C|
  36. MACRO _DragWindow =    DC.W $A925|
  37. MACRO _SystemTask =    DC.W $A9B4|
  38. MACRO _MenuSelect =    DC.W $A93D|
  39. MACRO _HiLiteMenu =    DC.W $A938|
  40. MACRO _EnableItem =    DC.W $A939|
  41. MACRO _DisableItem =    DC.W $A93A|
  42. MACRO _BeginUpdate =    DC.W $A922|
  43. MACRO _EndUpdate =    DC.W $A923|
  44. MACRO _SystemClick =    DC.W $A9B3|
  45. MACRO _FrontWindow =     DC.W $A924|
  46. MACRO _SelectWindow =     DC.W $A91F|
  47. MACRO _GetItem =     DC.W $A946|
  48. MACRO _OpenDeskAcc =     DC.W $A9B6|
  49. MACRO _TrackGoAway =     DC.W $A91E|
  50. MACRO _HideWindow =     DC.W $A916|
  51. MACRO _PenNormal =    DC.W $A89E|
  52. MACRO _ShowWindow =     DC.W $A915|
  53. MACRO _TENew    =    DC.W $A9D2|
  54. MACRO _TECut    =    DC.W $A9D6|
  55. MACRO _TECopy    =    DC.W $A9D5|
  56. MACRO _TEPaste    =    DC.W $A9DB|
  57. MACRO _TEDelete    =    DC.W $A9D7|
  58. MACRO _TEActivate =    DC.W $A9D8|
  59. MACRO _TEDeactivate =    DC.W $A9D9|
  60. MACRO _SysEdit =    DC.W $A9C2|
  61. MACRO _NewDialog =     DC.W $A97D|
  62. MACRO _GetResource =    DC.W $A9A0|
  63. MACRO _IsDialogevent =     DC.W $A97F|
  64. MACRO _Dialogselect =     DC.W $A980|
  65. MACRO _CloseWindow =     DC.W $A92D|
  66.  
  67. ;      DECLARE LABELS EXTERNAL
  68.  
  69. XDEF    START                ; required for linker 
  70.  
  71. ;     LOCAL EQUATES
  72.  
  73. MouseDown    equ    1
  74. MaxEvents    equ    12
  75. AllEvents    equ    $0000FFFF
  76. TEXTRHANDLE    equ    A2
  77.  
  78. ;     MAIN PROGRAM SEGMENT
  79.  
  80.     DC.W    'DAVE'        ;find start of program
  81.     
  82. ; --- SAVE THE WORLD ------------
  83.  
  84. START:     MOVEM.L D0-D7/A0-A6, -(SP)
  85.          LEA    SAVEREGS,A0
  86.          MOVE.L    A6,(A0)       ; local var
  87.          MOVE.L    A7,4(A0)     ; stack ptr
  88.         
  89. ; ---INITIALIZE ALL MANAGERS--------
  90.  
  91. ; SET UP QUICKDRAW GLOBALS
  92.     
  93. PEA -4(A5)        ;push qd global ptr
  94. _InitGraf            ;init quickdraw global 
  95.    
  96. ;---- SET UP REMAINING MANAGERS  ---
  97.  
  98. _InitFont              ; init font manager
  99. _InitWind         ; init window manager
  100. _InitMenu           ; init menu manager
  101.     
  102. CLR.L    -(SP)         ; kill the restart 
  103. _InitDialog        ; init dialog manager
  104.     
  105. _TEInit            ; init text edit (ROM) 
  106.     
  107. MOVE.W  #2,-(SP)      ;  set-up
  108. _Initpack            ; init package mgr
  109.  
  110. MOVE.L    #AllEvents,D0    ;all events
  111. _FlushEvents             ;flushed
  112.     
  113. _InitCursor           ; make cursor the arrow
  114.  
  115.  
  116. ; -- SET UP MENU BAR WITH POP-UP MENUS
  117.  
  118. CLR.L -(SP)        ;returned menu handle
  119. MOVE.W #1,-(SP)        ;push menu ID 1 Apple
  120. _GetRMenu        ;get menu from resource
  121. LEA APPLEMENU,A0        ; copy apple menu handle 
  122. MOVE.L (SP),(A0)           ; to local data block
  123. MOVE.L (SP), -(SP)    ;push menu handle for desk acc.
  124.             ;menu handle still on stack
  125. CLR.W -(SP)        ;push 0 for append
  126. _InsertMenu        ;add menu item for About...
  127.  
  128. MOVE.L #'DRVR', -(SP)    ;load all DRVR type resources
  129. _AddResMenu        ;add desk accessories
  130.             ;from system file.
  131. CLR.L -(SP)        ;return menu handle
  132. MOVE.W #2,-(SP)        ;push menu ID 2 File
  133. _GetRMenu        ;get menu from resource            
  134. LEA FILEMENU,A0            ; copy FILE menu handle 
  135. MOVE.L (SP),(A0)           ; to local data block
  136.             ;leave handle on stack
  137. CLR.W -(SP)        ;append to menu
  138. _InsertMenu        ;the File stuff
  139.  
  140. CLR.L -(SP)        ;return menu handle
  141. MOVE.W #3,-(SP)        ;push menu ID 3 Edit
  142. _GetRMenu        ;get menu from resource
  143.             ;leave handle on stack
  144. LEA EDITMENU,A0        ; copy EDIT menu handle 
  145. MOVE.L (SP),(A0)           ; to local data block            
  146. CLR.W -(SP)        ;append to menu
  147. _InsertMenu        ;the File stuff
  148.  
  149. _DrawMenuBar        ;our menu bar!
  150.  
  151. ;-- SET UP NEW HEAP WINDOW ----
  152.     
  153. CLR.L -(SP)             ;return window ptr
  154. CLR.L -(SP)             ;window record ptr. (HEAP)
  155. PEA WBOUNDS                 ;window rectangle size
  156. PEA WINDTITLE               ; window title
  157. MOVE.W #$100,-(SP)        ; true = visible 
  158. MOVE.W #0,-(SP)          ; doc type window
  159. MOVE.L #-1,-(SP)         ; window in front
  160. MOVE.W #$100,-(SP)       ; true=closebox
  161. MOVE.L #0, -(SP)            ; reference value 
  162. _NewWindow               ; make new window
  163.     
  164. ; --  ACTIVATE THIS NEW WINDOW ------
  165.  
  166. LEA WPOINTER,A0            ; copy our window ptr 
  167. MOVE.L (SP),(A0)           ; to stacksave
  168.             ; ptr still on stack.
  169. _setport                ; set to current window
  170.  
  171. ; --- SET UP TEXT EDIT ABILITY -------
  172.  
  173. CLR.L    -(SP)        ;text handle returned
  174. PEA    DestRect    ;destination for text
  175. PEA    ViewRect    ;viewing of text
  176. _TENew            ;new text record on heap
  177. MOVE.L    (SP)+,TEXTRHANDLE;pop handle
  178.  
  179. ; ---- INITALIZE VARIABLES --------
  180.  
  181. JSR    INITVAR        ;INITIALIZE DS STORAGE
  182.  
  183. ;  --------- EVENT LOOP ------------
  184.     
  185. GetEvent:
  186.  
  187. _SystemTask        ;check out desk acc
  188.  
  189. CLR    -(SP)        ;returned event 
  190. MOVE    #AllEvents,-(SP)    ;mask all events
  191. PEA    EventRecord    ; event record block
  192. _GetNextEvent        ;go check the mouse 
  193. MOVE    (SP)+,D0    ;get event result 
  194. CMP    #0,D0        ;if 0 then no event 
  195. BEQ    GetEvent    ;loop until it happens
  196.  
  197. ;  check for dialog event
  198.  
  199. CLR    -(SP)        ;result
  200. PEA    EventRecord    ;push event
  201. _IsDialogevent        ;was it a dialog event?
  202. MOVE    (SP)+,D0    ;get result
  203. CMP    #0,D0        ;is it false?
  204. BEQ    Processevent    ;yes, not dialog
  205.             ;no, was dialog event
  206.             
  207. CLR    -(SP)        ;result
  208. PEA    EventRecord    ;event
  209. PEA    ABOUTHANDLE    ;dialog handle
  210. PEA    ITEMHIT        ;item hit
  211. _Dialogselect
  212. MOVE    (SP)+,D0    ;get result
  213. CMP    #0,D0        ;is it false?
  214. BEQ    GetEvent    ;yes
  215. ; note: always false since no
  216. ; controls enabled. closebox is
  217. ; returned false.
  218. _Debugger        ;do we ever get here?
  219. JMP GetEvent
  220.  
  221. Processevent:
  222.  
  223.     ; JUMP TABLE OF EVENT PROCESSING
  224.     
  225. CLR.L    D0
  226. MOVE    What,D0        ;what to do! (event number)
  227. CMP    #MaxEvents,D0    ;event no. >11?
  228. BGE    GetEvent    ;yes so ignore it
  229. ADD    D0,D0        ;multiply by 2
  230. MOVE    EventTable(D0),D0
  231. JMP    EventTable(D0)    ;execute event
  232.  
  233. EventTable:
  234.  
  235.     DC.W    GetEvent-EventTable    ;null event #0
  236.     DC.W    ButtonDown-EventTable   ;mouse down event #1
  237.     DC.W    GetEvent-EventTable    ;mouse up #2
  238.     DC.W    GetEvent-EventTable    ;key down event #3
  239.     DC.W    GetEvent-EventTable    ;key up event #4
  240.     DC.W    GetEvent-EventTable    ;auto key #5
  241.     DC.W    Update-EventTable      ;update event #6
  242.     DC.W    GetEvent-EventTable    ;Disk Event #7
  243.     DC.W    Activate-EventTable    ;activate event #8
  244.     DC.W    GetEvent-EventTable    ;Abort #9
  245.     DC.W    GetEvent-EventTable    ;Network #10
  246.     DC.W    GetEvent-EventTable    ;I/O Driver #11
  247.     DC.W    GetEvent-EventTable    ;Appl. event 1 #12
  248.     DC.W    GetEvent-EventTable    ;Appl. event 2 #13
  249.     DC.W    GetEvent-EventTable    ;Appl. event 3 #14
  250.     DC.W    GetEvent-EventTable    ;Appl. event 4 #15
  251.     
  252. ; note that linker error may result if 
  253. ; the table entry is >128 
  254.  
  255. ; --------  EVENT PROCESSING ROUTINES --------
  256.  
  257. Activate:
  258.  
  259. ; window needs attention
  260.  
  261. MOVE.L     WPOINTER,A0    ;copy window ptr.
  262. CMP.L    Message,A0    ;Event our window?
  263. BNE    GetEvent    ;no
  264.  
  265. MOVE.W    Modify,D0    ;yes, check modify flags    
  266. BTST    #0,D0        ;check activate bit
  267. BEQ    Deactivate    ;unactivate our window
  268.  
  269. ; activate our window
  270.  
  271. MOVE.L    TEXTRHANDLE,-(SP)
  272. _TEActivate        ;activate text edit
  273.  
  274. MOVE.L    EDITMENU,-(SP)    ;push menu handle
  275. MOVE.W    #1,-(SP)    ;push menu item 1
  276. _DisableItem        ;disable undo
  277. MOVE.L    EDITMENU,-(SP)    ;push menu handle
  278. MOVE.W    #3,-(SP)    ;push menu item 
  279. _DisableItem        ;disable cut
  280. MOVE.L    EDITMENU,-(SP)    ;push menu handle
  281. MOVE.W    #4,-(SP)    ;push menu item 
  282. _DisableItem        ;disable copy
  283. MOVE.L    EDITMENU,-(SP)    ;push menu handle
  284. MOVE.W    #5,-(SP)    ;push menu item 
  285. _DisableItem        ;disable paste
  286. MOVE.L    EDITMENU,-(SP)    ;push menu handle
  287. MOVE.W    #6,-(SP)    ;push menu item 
  288. _DisableItem        ;disable clear
  289.  
  290. MOVE.L    WPOINTER,-(SP)    ;push window ptr
  291. _SetPort        ;make our port active
  292. JMP    GetEvent
  293.  
  294. Deactivate:
  295.  
  296. MOVE.L TEXTRHANDLE,-(SP)
  297. _TEDeactivate         ;turn off text edit
  298.             ;let desk acc. use it
  299. MOVE.L    EDITMENU,-(SP)
  300. MOVE.W    #1,-(SP)
  301. _EnableItem        ;enable undo for desk acc.
  302. MOVE.L    EDITMENU,-(SP)    ;push menu handle
  303. MOVE.W    #3,-(SP)    ;push menu item 
  304. _EnableItem        ;able cut
  305. MOVE.L    EDITMENU,-(SP)    ;push menu handle
  306. MOVE.W    #4,-(SP)    ;push menu item 
  307. _EnableItem        ;enable copy
  308. MOVE.L    EDITMENU,-(SP)    ;push menu handle
  309. MOVE.W    #5,-(SP)    ;push menu item 
  310. _EnableItem        ;enable paste
  311. MOVE.L    EDITMENU,-(SP)    ;push menu handle
  312. MOVE.W    #6,-(SP)    ;push menu item 
  313. _EnableItem        ;enable clear
  314. JMP    GetEvent
  315.  
  316.  
  317. Update:
  318.  
  319. ; window needs refreshing
  320.  
  321. MOVE.L    WPOINTER,-(SP)    ;push window ptr
  322. _BeginUpdate
  323. MOVE.L    WPOINTER,-(SP)    ;push our window ptr.
  324. _SetPort        ;restore our port
  325.             ;least an update draw in
  326.             ;the wrong window.
  327. BSR    QDSTUFF        ;re-draw everything
  328. MOVE.L    WPOINTER,-(SP)
  329. _EndUpdate
  330. JMP     GetEvent
  331.  
  332.  
  333. ButtonDown:
  334.  
  335. CLR    -(SP)        ;result of findwindow
  336. MOVE.L    Point,  -(SP)    ;push mouse coordinates
  337. PEA    WWindow        ;push holder for window handle
  338. _FindWindow        ;where was mouse click?
  339. CLR.L    D0        
  340. MOVE (SP)+,D0        ;pop region number
  341. ADD    D0,D0        ;multiply by 2
  342. MOVE    WindowTable(D0),D0
  343. JMP    WindowTable(D0)    ;do mouse down event
  344.  
  345. WindowTable:            ;table of mouse button down events
  346.     
  347.     DC.W    GetEvent-WindowTable    ;in desk (none of following)
  348.     DC.W    Menubar-WindowTable    ;in menu bar 
  349.     DC.W    System-WindowTable    ;in system window
  350.     DC.W    Content-WindowTable    ;in content region 
  351.     DC.W    Drag-WindowTable    ;in drag region
  352.     DC.W    GetEvent-WindowTable    ;in grow region (ignored)
  353.     DC.W    Hide-WindowTable    ;in go-away region    
  354.  
  355. System:
  356.  
  357. ; Button pressed in a system window
  358. ; _SystemClick calls the desk acc.
  359.  
  360. PEA    EventRecord    ;push event record
  361. MOVE.L    WWindow,-(SP)    ;push find window pointer
  362. _SystemClick        ;let system do desk acc.
  363. JMP    GetEvent
  364.  
  365. Content:
  366.  
  367. MOVE.L    WWindow,-(SP)    ;activate find window
  368. _SelectWindow        ;make it front window
  369. JMP    GetEvent
  370.  
  371. Drag:            ;mouse button in drag window
  372.             ;could be dialog window
  373. MOVE.L    WWindow,-(SP)    ;push find window pointer
  374. MOVE.L    Point, -(SP)    ;push mouse coordinates
  375. PEA    DRAGWINDOW    ;window boundries to drag
  376. _DragWindow        ;move window
  377.  
  378. MOVE.L    WWindow,A0    ;find window ptr.
  379. CMP.L    ABOUTHANDLE,A0    ;is it about window?
  380. BNE  ENDDRAG        ;no, exit
  381. JSR    INITVAR        ;yes, reset about window location
  382.  
  383. ENDDRAG:
  384. JMP    GetEvent    ;return to event loop
  385.  
  386. Hide:            ;close box
  387.             ;could be dialog window
  388. CLR.W    -(SP)        ;boolean result
  389. MOVE.L    WWindow,-(SP)    ;push find window ptr
  390. MOVE.L    Point, -(SP)    ;push mouse location
  391. _TrackGoAway
  392. MOVE.W (SP)+,D0        ;get result
  393. BEQ    GetEvent    ;false result
  394.  
  395. MOVE.L    WWindow,A0    ;find window ptr.
  396. CMP.L    WPOINTER,A0    ;is it our window?
  397. BEQ    Hideours    ;yes, hide ours
  398.  
  399. MOVE.L    WWindow, -(SP)    ;must be about window
  400. _CloseWindow        ;close it
  401.  
  402. ;note: Don't use closedialog for modeless
  403. ;dialog windows if more than one present.
  404.  
  405. ; update about window location
  406.  
  407. LEA    DBOUNDS,A0    ;set-up our globals
  408. LEA    Savetop,A1
  409.  
  410. MOVE.W    0(A0),D0    ;TOP VALUE
  411. MOVE.W 0(A1),D1        ;origonal value
  412. CMP.W    D1,D0        ;past init value?
  413. BLE    GetEvent    ;skip update
  414.             
  415. ADDI    #-20,D0        ;decrement top
  416. MOVE.W    D0,(A0)
  417.  
  418. MOVE.W    2(A0),D0    ;LEFT VALUE
  419. ADDI    #-20,D0
  420. MOVE.W    D0,2(A0)
  421.  
  422. MOVE.W    4(A0),D0    ;BOTTOM VALUE
  423. ADDI    #-20,D0
  424. MOVE.W    D0,4(A0)
  425.  
  426. MOVE.W    6(A0),D0    ;RIGHT VALUE
  427. ADDI    #-20,D0
  428. MOVE.W    D0,6(A0)
  429.  
  430. JMP    GetEvent
  431.  
  432. Hideours:
  433.  
  434. MOVE.L    WPOINTER, -(SP)    ;our window ptr
  435. _HideWindow        ;hide window
  436. MOVE.L    FILEMENU,-(SP)    ;menu handle
  437. MOVE.W    #1,-(SP)    ;open item
  438. _EnableItem        ;enable open for file menu
  439. MOVE.L    FILEMENU,-(SP)    ;push menu handle
  440. MOVE.W    #2,-(SP)    ;close
  441. _DisableItem        ;disable it
  442. JMP GetEvent
  443.  
  444. Menubar:
  445.  
  446. CLR.L    -(SP)        ;returned menu choice
  447. MOVE.L    Point,-(SP)    ;mouse position
  448. _MenuSelect        ;Find menu selected
  449. MOVE    (SP)+,D5    ;pop menu ID to D5
  450. MOVE    (SP)+,D6    ;pop menu item ID to D6
  451. CLR    -(SP)        ;select all menus
  452. _HiLiteMenu        ;unhilite them all
  453.  
  454. CMP    #1, D5        ;apple menu?
  455. BEQ    Inapplemenu    
  456. CMP    #2, D5        ;file menu?
  457. BEQ    Infilemenu
  458. CMP    #3,D5        ;edit menu?
  459. BEQ    Ineditmenu
  460. BRA    GetEvent    ;no place else
  461.  
  462. Inapplemenu:
  463.  
  464. CMP    #1, D6        ;is it about...?
  465. BEQ    About
  466.  
  467. ; must be a desk accessory
  468.  
  469. MOVE.L    APPLEMENU, -(SP)    ;push apple menu handle
  470. MOVE.W    D6,-(SP)        ;push item number
  471. PEA    DeskName        ;push holder for desk name
  472. _GetItem            ;find desk acc. name
  473.  
  474. CLR    -(SP)        ;result
  475. PEA    DeskName    ;push desk acc. name
  476. _OpenDeskAcc        ;do it
  477. MOVE    (SP)+,D0    ;pop result
  478. MOVE.L    WPOINTER,-(SP)    ;push window ptr.
  479. _SetPort        ;restore our port
  480. JMP     GetEvent
  481.  
  482. About:
  483.  
  484. CLR.L -(SP)        ;return handle
  485. MOVE.L    #'DITL',-(SP)    ;item list
  486. MOVE.W    #256,-(SP)    ;ID
  487. _GetResource        ;load item list resource
  488. LEA DIALOGITEMS,A0    ;handle storage
  489. MOVE.L    (SP)+,(A0)    ;save handle
  490.  
  491. ; update window location
  492.  
  493. LEA    DBOUNDS,A0    ;set-up our globals
  494.  
  495. MOVE.W    0(A0),D0    ;TOP VALUE
  496. ADDI    #20,D0
  497. MOVE.W    D0,(A0)
  498.  
  499. MOVE.W    2(A0),D0    ;LEFT VALUE
  500. ADDI    #20,D0
  501. MOVE.W    D0,2(A0)
  502.  
  503. MOVE.W    4(A0),D0    ;BOTTOM VALUE
  504. ADDI    #20,D0
  505. MOVE.W    D0,4(A0)
  506.  
  507. MOVE.W    6(A0),D0    ;RIGHT VALUE
  508. ADDI    #20,D0
  509. MOVE.W    D0,6(A0)
  510.  
  511. ;-- SET UP MODELESS DIALOG WINDOW ON HEAP ----
  512.     
  513. CLR.L -(SP)             ;return window ptr
  514. CLR.L -(SP)             ;window record ptr. (HEAP)
  515. PEA DBOUNDS             ;window rectangle size
  516. PEA DWINDTITLE           ; window title
  517. MOVE.W #$100,-(SP)        ; true = visible 
  518. MOVE.W #16,-(SP)         ; round doc type window
  519. MOVE.L #-1,-(SP)         ; window in front
  520. MOVE.W #$100,-(SP)       ; true=closebox
  521. MOVE.L #0, -(SP)            ; reference value
  522. MOVE.L DIALOGITEMS,-(SP) ; items list handle
  523. _NewDialog               ; make new window
  524.  
  525. LEA    ABOUTHANDLE,A0    ;DIALOG WINDOW HANDLE
  526. MOVE.L    (SP),(A0)    ; SAVE HANDLE
  527. _SetPort        ;make dialog active
  528.  
  529. MOVE.L    TEXTRHANDLE,-(SP) ;deactivate text edit
  530. _TEDeactivate
  531. JMP GetEvent
  532.  
  533. Infilemenu:
  534.  
  535. CMP    #1, D6        ;Open?
  536. BEQ    Open
  537. CMP    #2, D6        ;Close?
  538. BEQ    Close
  539. CMP    #3,D6        ;quit?
  540. BNE    GetEvent    ;no, try again
  541. BRA    Exit        ;yes, exit
  542.  
  543. Open:
  544.  
  545. ; window is hiding...open it again
  546.  
  547. MOVE.L    WPOINTER, -(SP)    ;our window ptr
  548. _ShowWindow
  549. MOVE.L    FILEMENU,-(SP)    ;menu handle
  550. MOVE.W    #2,-(SP)    ;open item
  551. _EnableItem        ;enable open for file menu
  552. MOVE.L    FILEMENU,-(SP)    ;push menu handle
  553. MOVE.W    #1,-(SP)    ;open
  554. _DisableItem        ;disable it
  555. JMP GetEvent
  556.  
  557. Close:
  558.  
  559. ; perform go away function
  560.  
  561. MOVE.L    WPOINTER, -(SP)    ;our window ptr
  562. _HideWindow        ;hide window
  563. MOVE.L    FILEMENU,-(SP)    ;menu handle
  564. MOVE.W    #1,-(SP)    ;open item
  565. _EnableItem        ;enable open for file menu
  566. MOVE.L    FILEMENU,-(SP)    ;push menu handle
  567. MOVE.W    #2,-(SP)    ;close
  568. _DisableItem        ;disable it
  569. JMP GetEvent
  570.  
  571.  
  572. Ineditmenu:
  573.  
  574. ; check if system edit in desk acc.
  575.  
  576. CLR     -(SP)        ;result
  577. MOVE.W    D6,-(SP)    ;push menu item
  578. SUBQ    #1, (SP)    ;system edit offset
  579. _SysEdit        ;do editing
  580. MOVE.B    (SP)+,D0    ;pop result
  581. BNE    GetEvent    ;system edit did it
  582.             ;desk acc. not active
  583.             
  584. CLR.L    -(SP)
  585. _FrontWindow        ;whoose up?
  586. MOVE.L (SP)+,A0
  587. CMP.L    ABOUTHANDLE,A0    ;is this an about window?
  588. BEQ    GetEvent    ;yes, ignore it
  589.  
  590. CMP    #3,D6        ;our cut?
  591. BEQ    CUT
  592. CMP    #4,D6        ;our copy?
  593. BEQ    COPY
  594. CMP    #5,D6        ;our paste?
  595. BEQ    PASTE
  596. CMP    #6,D6        ;our clear?
  597. BEQ    CLEAR
  598.  
  599. JMP    GetEvent    ;nothing left
  600.  
  601. ; ------- text editing only for desk acc. ------
  602.  
  603. CUT:
  604. MOVE.L    TEXTRHANDLE,-(SP)    ;text handle
  605. _TECut
  606. JMP     GetEvent
  607.  
  608. COPY:
  609. MOVE.L    TEXTRHANDLE,-(SP)    ;text handle
  610. _TECopy
  611. JMP    GetEvent
  612.  
  613. PASTE:
  614. MOVE.L    TEXTRHANDLE,-(SP)    ;text handle
  615. _TEPaste
  616. JMP    GetEvent
  617.  
  618. CLEAR:
  619. MOVE.L    TEXTRHANDLE,-(SP)    ;text handle
  620. _TEDelete
  621. JMP    GetEvent
  622.  
  623.  
  624. Exit:
  625.  
  626. JMP    Tofinder    ;return to finder
  627.  
  628. ; ---------- END OF MAIN --------------
  629.  
  630. ; ---------- INITVAR SUBROUTINE ----------
  631. INITVAR:
  632.  
  633. LEA    DBOUNDS,A0    ;set-up dialog window
  634.             ;box frame size.
  635. MOVE.W #70,   (A0)    ;TOP
  636. MOVE.W #70,  2(A0)    ;LEFT
  637. MOVE.W #220, 4(A0)    ;BOTTOM
  638. MOVE.W #370, 6(A0)    ;RIGHT
  639.  
  640. LEA Savetop,A1
  641. MOVE.W (A0), (A1)    ;GET TOP
  642. RTS
  643. ; ---------- QDSTUFF SUBROUTINE ----------
  644. QDSTUFF:
  645.  
  646. ; This subroutine is a static
  647. ; window display of text for our
  648. ; ad. It would more properly be
  649. ; placed in a resource file as
  650. ; strings, but when in a hurry...
  651.  
  652. _PenNormal
  653.  
  654. LEA    top,A0        ;set-up appl. window
  655.             ;box frame size.
  656. MOVE.W #10,   (A0)    ;TOP
  657. MOVE.W #30,  2(A0)    ;LEFT
  658. MOVE.W #250, 4(A0)    ;BOTTOM
  659. MOVE.W #400, 6(A0)    ;RIGHT
  660.  
  661. PEA top                 ;frame rectangle
  662. _FrameRect        ;draw rectangle
  663.  
  664. MOVE.W #1, -(SP)        ;FONT
  665. _TextFont
  666. MOVE.W #12, -(SP)    ;style
  667. _TextFace
  668. MOVE.W #24, -(SP)    ;SIZE
  669. _TextSize
  670. MOVE.W #40, -(SP)       ; h
  671. MOVE.W #50, -(SP)    ;v
  672. _MoveTo            ;set pen location
  673. PEA 'MacTutor'
  674. _DrawString
  675.  
  676. MOVE.W #0, -(SP)    ;chicago
  677. _TextFont
  678. MOVE.W #0, -(SP)    ;normal
  679. _TextFace
  680. MOVE.W #12, -(SP)        ;12 point size
  681. _TextSize
  682. MOVE.W #40, -(SP)    ;H
  683. MOVE.W #80, -(SP)    ;V
  684. _MoveTo
  685. PEA 'The Macintosh Programming Journal'
  686. _DrawString
  687.  
  688. MOVE.W #40, -(SP)    ;H
  689. MOVE.W #110, -(SP)    ;V
  690. _MoveTo
  691. PEA 'AT LAST! A no-nonsense, no fluff Journal'
  692. _DrawString
  693.  
  694. MOVE.W #40, -(SP)    ;H
  695. MOVE.W #130, -(SP)    ;V
  696. _MoveTo
  697. PEA 'devoted to programming ON the Mac, FOR the Mac!'
  698. _DrawString
  699.  
  700. MOVE.W #40, -(SP)    ;H
  701. MOVE.W #150, -(SP)    ;V
  702. _MoveTo
  703. PEA 'Subscribe to MacTutor, and learn how to create'
  704. _DrawString
  705.  
  706. MOVE.W #40, -(SP)    ;H
  707. MOVE.W #170, -(SP)    ;V
  708. _MoveTo
  709. PEA 'this assembly language program, including the icon!'
  710. _DrawString
  711.  
  712. MOVE.W #40, -(SP)    ;H
  713. MOVE.W #190, -(SP)    ;V
  714. _MoveTo
  715. PEA 'So do not delay. Send for the ONLY Technical '
  716. _DrawString
  717.  
  718. MOVE.W #40, -(SP)    ;H
  719. MOVE.W #210, -(SP)    ;V
  720. _MoveTo
  721. PEA 'publication that teaches the Mac technology!'
  722. _DrawString
  723.  
  724. MOVE.W #80, -(SP)    ;H
  725. MOVE.W #230, -(SP)    ;V
  726. _MoveTo
  727. PEA 'Send $24 for 12 issues to:'
  728. _DrawString
  729.  
  730. LEA    top,A0
  731. MOVE.W #215,   (A0)    ;TOP
  732. MOVE.W #250,  2(A0)    ;LEFT
  733. MOVE.W #290, 4(A0)    ;BOTTOM
  734. MOVE.W #450, 6(A0)    ;RIGHT    
  735. PEA top                 ;frame rectangle
  736. _EraseRect        ;clear rectangle
  737. PEA top
  738. _FrameRect        ;draw rectangle
  739.  
  740. MOVE.W #2, -(SP)    ;WIDTH
  741. MOVE.W #2, -(SP)    ;HEIGHT
  742. _PenSize
  743.  
  744. LEA    top,A0
  745. MOVE.W #218,   (A0)    ;TOP
  746. MOVE.W #253,  2(A0)    ;LEFT
  747. MOVE.W #287, 4(A0)    ;BOTTOM
  748. MOVE.W #447, 6(A0)    ;RIGHT    
  749. PEA top                 ;frame rectangle
  750. _FrameRect        ;draw rectangle
  751.  
  752. MOVE.W #280, -(SP)    ;H
  753. MOVE.W #230, -(SP)    ;V
  754. _MoveTo
  755. PEA 'MacTutor'
  756. _DrawString
  757.  
  758.  
  759. MOVE.W #280, -(SP)    ;H
  760. MOVE.W #245, -(SP)    ;V
  761. _MoveTo
  762. PEA 'P.O. Box 846'
  763. _DrawString
  764.  
  765.  
  766. MOVE.W #280, -(SP)    ;H
  767. MOVE.W #260, -(SP)    ;V
  768. _MoveTo
  769. PEA 'Placentia, CA  92670'
  770. _DrawString
  771.  
  772.  
  773. MOVE.W #280, -(SP)    ;H
  774. MOVE.W #275, -(SP)    ;V
  775. _MoveTo
  776. PEA 'Or call (714) 993-9939'
  777. _DrawString
  778.  
  779. RTS
  780.  
  781. ; --- RESTORE THE WORLD --------
  782.  
  783. Tofinder:  LEA    SAVEREGS,A0      ; get 'em back
  784.        MOVE.L       (A0),A6    ; local var
  785.        MOVE.L     4(A0),A7    ;restore stack 
  786.        MOVEM.L (SP)+,D0-D7/A0-A6    
  787.         
  788. ; ---- RETURN TO FINDER --------
  789.  
  790.         RTS             ; return to finder
  791.  
  792. ; ----LOCAL DATA AREA -----------
  793.  
  794. APPLEMENU:    DC.L    0    ;apple menu handle
  795. FILEMENU:    DC.L    0    ;file menu handle
  796. EDITMENU:    DC.L    0    ;edit menu handle
  797. DeskName    DCB.W    16,0    ;Desk accesory's name
  798. SAVEREGS:    DCB.L   2,0     ;set  save area
  799.  
  800. ;  -------  our window definitions ------
  801.  
  802. WPOINTER:    DC.L     0        ;store window pt
  803.  
  804. WBOUNDS:    DC.W   40      ;TOP - window size rectangle
  805.         DC.W    2    ;LEFT
  806.         DC.W    335    ;BOTTOM
  807.         DC.W    508    ;RIGHT
  808.         
  809. ViewRect:    DC.W    50    ;text edit view rectangle
  810.         DC.W    4
  811.         DC.W    245
  812.         DC.W    405
  813.         
  814. DestRect:    DC.W    50    ;text edit destination rectangle
  815.         DC.W    4
  816.         DC.W    245
  817.         DC.W    405
  818.         
  819. WINDTITLE:         DC.B    43       ; title length
  820.                  DC.B    'MacTutor: The Macintosh Programming Journal',0
  821.              
  822. DRAGWINDOW:    DC.W    30    ;rectangle
  823.         DC.W    1    ;for dragging
  824.         DC.W    350
  825.         DC.W    510
  826.  
  827. ;  -------  our dialog window definitions ------
  828.  
  829. ABOUTHANDLE:    DC.L    0    ;handle holder for window
  830.                 
  831. DWINDTITLE:     DC.B    26       ; title length
  832.                  DC.B    'ALL ABOUT THE MacTutor Ad ',0
  833.              
  834. ITEMHIT:    DC.W    0    ;ITEM HIT HOLDER
  835.  
  836. DIALOGITEMS:    DC.L    0    ;handle holder for resource DITL
  837. ; ------------------------------------
  838.  
  839. EventRecord:
  840.     
  841.     What:        DC.W    0    ;what event number
  842.     Message:    DC.L    0    ;ptr. to msg
  843.     When:        DC.L    0    ;Time event was posted
  844.     Point:      DC.L    0    ;mouse coordinates
  845.     Modify:     DC.W    0    ;state of keys & button
  846.     
  847. WWindow:    DC.L    0    ;Find window's result
  848.  
  849.     
  850.                 
  851. ; --------------   APPLICATION GLOBALS  -----------
  852.         
  853. top:        DS.W    1        ;frame size storage
  854. left:        DS.W    1        ;for QDSTUFF rectangle
  855. bottom:        DS.W    1
  856. right:        DS.W    1
  857.  
  858. DBOUNDS:    DS.W    1      ;TOP - window size rectangle
  859.         DS.W    1    ;LEFT
  860.         DS.W    1    ;BOTTOM
  861.         DS.W    1    ;RIGHT
  862.         
  863. Savetop:    DS.W    1    ;save top value        
  864. ; ------------   END OF PROGRAM ----------------
  865.  
  866.